package graph.digraph;

import linear.Queue;


/**
 * 有向图
 */
public class Digraph {
    // 顶点个数
    private int V;
    // 边个数
    private int E;
    // 邻接表
    private Queue<Integer>[] adj;

    public Digraph(int v) {
        this.V = v;
        E = 0;
        // 初始化邻接表
        this.adj = new Queue[v];
        for (int i = 0; i < adj.length; i++) {
            adj[i] = new Queue<>();
        }
    }


    public int V() {
        return V;
    }

    public int E() {
        return E;
    }

    /**
     * 向有向图中添加一条边 v->w
     */
    public void addEdge(int v, int w) {
        adj(v).enqueue(w);
        E++;
    }

    public Queue<Integer> adj(int v) {
        return adj[v];
    }

    /**
     * 获取反向图
     */
    private Digraph reverse() {
        // 新建一个图
        Digraph digraph = new Digraph(V);
        // 遍历邻接表
        for (int v = 0; v < V; v++) {
            // 遍历邻接表元素(边)
            for (Integer w : adj(v)) {
                // 反向
                digraph.addEdge(w, v);
            }
        }
        return digraph;
    }


}
